package com.fy.market.types.common.utils;

import java.lang.reflect.Array;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Collection;
import java.util.Map;

/**
 * 对象操作工具
 */
public final class FyObjUtil {

    private FyObjUtil() {}

    /**
     * 判断对象的所有字段是否都“为空”。
     * 规则：
     * - null 视为空
     * - CharSequence 空串或全空白视为空
     * - Collection/Map 为空集合视为空
     * - 数组长度为0视为空
     * - 其余非空值视为非空
     */
    public static boolean isNullObj(Object target) {
        if (target == null) return true;
        Class<?> clazz = target.getClass();
        while (clazz != null && clazz != Object.class) {
            Field[] fields = clazz.getDeclaredFields();
            for (Field field : fields) {
                // 跳过 static 与 transient 字段
                int mod = field.getModifiers();
                if (Modifier.isStatic(mod) || Modifier.isTransient(mod)) continue;
                field.setAccessible(true);
                try {
                    Object value = field.get(target);
                    if (!isEmptyValue(value)) {
                        return false; // 发现一个非空字段即可判定整体非空
                    }
                } catch (IllegalAccessException ignored) {
                    // 访问异常默认视为空，继续检查其它字段
                }
            }
            clazz = clazz.getSuperclass();
        }
        return true;
    }

    private static boolean isEmptyValue(Object value) {
        if (value == null) return true;
        if (value instanceof CharSequence) {
            return value.toString().trim().isEmpty();
        }
        if (value instanceof Collection) {
            return ((Collection<?>) value).isEmpty();
        }
        if (value instanceof Map) {
            return ((Map<?, ?>) value).isEmpty();
        }
        if (value.getClass().isArray()) {
            return Array.getLength(value) == 0;
        }
        return false;
    }
} 